package com.stylefeng.guns.modular.system.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.common.constant.state.SpType;
import com.stylefeng.guns.core.util.Convert;
import com.stylefeng.guns.modular.system.dao.RoleCwMapper;
import com.stylefeng.guns.modular.system.dao.SysPrivilegeMapper;
import com.stylefeng.guns.modular.system.model.RoleCw;
import com.stylefeng.guns.modular.system.model.SysPrivilege;
import com.stylefeng.guns.modular.system.service.IRoleCwService;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 系统角色表 服务实现类
 * </p>
 *
 * @author stylefeng
 * @since 2018-08-30
 */
@Service
@Transactional
public class RoleCwServiceImpl extends ServiceImpl<RoleCwMapper, RoleCw> implements IRoleCwService {

    @Resource
    private RoleCwMapper roleCwMapper;


    @Resource
    private SysPrivilegeMapper sysPrivilegeMapper;


    /**
     * 设置某个角色的权限
     * @param spMethod 访问上下文
     * @param soId 所属机构ID
     * @param roleId 角色id
     * @param ids    权限的id
     * @date 2017年2月13日 下午8:26:53
     */
    public void setAuthority(int roleId,int soId,String ids,String spMethod) {
        // 删除该角色所有的权限
        Wrapper<SysPrivilege> wrapper=new EntityWrapper<>();
        wrapper.eq("sp_type",SpType.ROLE.getCode()).and();
        wrapper.eq("sp_type_id",roleId);
        List<SysPrivilege> list = this.sysPrivilegeMapper.selectList(wrapper);
        if (!list.isEmpty()) {
            List<Integer> idsL=list.parallelStream().sorted(Comparator.comparing(SysPrivilege::getSpId)).map(SysPrivilege::getSpId).collect(Collectors.toList());
            this.sysPrivilegeMapper.deleteBatchIds(idsL);
        }
        // 添加新的权限
        for (Integer id : Convert.toIntArray(true, Convert.toStrArray(",", ids))) {
            SysPrivilege relation = new SysPrivilege();
            relation.setSpType(SpType.ROLE.getCode());//按角色划分权限
            relation.setSpFunctionId(id);
            relation.setSpTypeId(roleId+"");
            relation.setSpMethod(spMethod);
            relation.setSoId(soId);
            this.sysPrivilegeMapper.insert(relation);
        }
    }

    /**
     * 删除某个角色下的所有权限
     *
     * @param roleId 角色id
     * @return
     * @date 2018年九月21日 下午7:57:51
     */
    @Override
    public int deleteRolesById(String roleId) {
       //删除角色
        this.roleCwMapper.deleteById(roleId);
        //* 删除该角色所有的权限 *//*
        Wrapper<SysPrivilege> dictEntityWrapper = new EntityWrapper<>();
        dictEntityWrapper.eq("sp_type", SpType.ROLE.getCode()).and();
        dictEntityWrapper.eq("sp_type_id",roleId);
        return this.sysPrivilegeMapper.delete(dictEntityWrapper);
      
    }


    /***
     * 互斥锁查询角色列表
     * @param roleCw 角色对象
     * @return
     */
    public List<RoleCw> selectListRoleCwForUpdate(RoleCw roleCw) throws DataAccessException{
        return this.roleCwMapper.selectListRoleCwForUpdate(roleCw);
    }
    /***
     * 互斥锁查询角色列表
     * @param roleCw 角色对象
     * @return
     */
    public List<RoleCw> selectListRoleCw(RoleCw roleCw) throws DataAccessException{

        return this.roleCwMapper.selectListRoleCw(roleCw);
    }
    /***
     * 新增数据
     * @param roleCw 角色对象
     * @return
     */
    public int insertRoleCw(RoleCw roleCw) throws DataAccessException{
        return this.roleCwMapper.insertRoleCw(roleCw);
    }

    /**
     * 批量更新角色名 根据src_temId 和sr_source（1）
     * @param roleCw
     */
    public int updateBatchRoleCw(RoleCw roleCw) throws DataAccessException{
        return this.roleCwMapper.updateBatchRoleCw(roleCw);
    }

    /**
     * 删除数据
     * @param roleCw
     */
    public void deleteRoleCw(RoleCw roleCw) throws DataAccessException{
        this.roleCwMapper.deleteRoleCw(roleCw);
    }
}
